import pickle
import tkSimpleDialog as tks
import tkFileDialog as tkf
import tkMessageBox as tkm
import random
import xmlrpclib
from batiment2 import *
from Etoile import *
from Planete import *
from unite import *
from univers import *
from vueClient import *
from modeleClient import *

class Controleur(object):
    def __init__(self):
        self.serveur = xmlrpclib.ServerProxy('http://localhost:8000')
        self.vue = Vue(self)
        self.modele=Modele(self)
        self.vue.root.mainloop()       
 
          
    ##demande au modele de creer l'univers avec valeurs specifies,
    ##envoie l'univers au serveur
    ##appelle joindrePartie() pour joindre la partie cree
    def creerCustom(self, nbEtoiles,hauteur,largeur,profondeur):
        univers=self.modele.creerCustom(nbEtoiles,hauteur,largeur,profondeur)
        print univers
        univers=pickle.dumps(univers)
        confirmation = self.serveur.creerUnivers(univers)
        if confirmation == "ok":
            self.joindrePartie()
    
    ##demande au modele de creer l'univers avec valeurs par defaut,
    ##envoie l'univers au serveur
    ##appelle joindrePartie() pour joindre la partie cree    
    def creerDefaut(self):
        univers=self.modele.creerDefaut()
        univers=pickle.dumps(univers)
        confirmation = self.serveur.creerUnivers(univers)
        if confirmation == "ok":
            self.joindrePartie()
    
    
    
    ##demande l'objet joueur au serveur
    ##Joins la partie en cours (ou qui vient d'etre cree)
    def joindrePartie(self):
        ##verfifie avec le serveur si une partie est en cours
        if self.serveur.demanderSiPartie()== "non":
            if tkm.askretrycancel("Aucune partie", "Il n'y a aucune partie en cours"):
                self.joindrePartie()
            else:
                self.vue.ecranPrincipal()
        else:
            ##demande son nom au joueur
            nick=tks.askstring("nickname", "Quel sera votre nom de joueur?")
            ##demande l'univers (une copie de l'univers en cours sur le serveur)
            ##au serveur (le serveur cree l'objet Joueur et la bin du joueur)
            univers=pickle.loads(self.serveur.joindrePartie(nick))
            ##demande l'objet joueur au serveur
            joueur=pickle.loads(self.serveur.getJoueur(nick))
            ##envoie l'univers et le joueur au modele
            self.modele.joindrePartie(univers, joueur)
            ##change l'ecran pour afficher la partie en cours
            self.vue.partieEnCours()
            ##commence a interroger periodiquement le serveur
            self.ping()
            #self.modele.initMouvement(0,500,350,5)
    
    ##Demander la liste des changements au serveur
    ##puis la traiter
    def ping(self):
        bin = self.serveur.ping(self.modele.joueur.nom)
        if bin <> "rien":
            bin = pickle.loads(bin)
            for i in bin:
                if i[0]=="mvt": ##Lorsqu'un autre joueur initialise un mouvement
                    print "client ping:"
                    print i
                    indexUnite=i[1]
                    x=i[2]
                    y=i[3]
                    z=i[4]
                    self.modele.initMouvement(indexUnite,x,y,z)
                elif i[0]=="nouveauJoueur": ##Lorsqu'un joueur joint la partie
                    newJoueur=i[1]
                    newEtoile=i[2]
                    newUnite=i[3]
                    self.modele.nouveauJoueur(newJoueur,newEtoile,newUnite)
                    self.vue.afficher()
        self.vue.root.after(500, self.ping)
    
    ##Lorsque le joueur initialise un deplacement sur le serveur
    ##puis dans le modele
    def initMouvement(self,indexUnite,x,y,z):
        print "controleur, appel:"
        print indexUnite,x,y,z
        toto=self.serveur.initMouvement(indexUnite,x,y,z)
        self.modele.initMouvement(indexUnite,x,y,z)
        
    def checkProprietaire(self, indexUnite):
        return self.modele.checkProprietaire(indexUnite)
    
    def afficher(self):
        self.vue.afficher()
    def effacer(self):
        self.vue.effacer()
        
        
#    def deplacerUnite(self, x, y, unite):
#        self.modele.deplacerUnite(x, y, unite)
        
jeu=Controleur()